#pragma once
class Mat4
{
private:
public:
    // | m[0][0] m[0][1] m[0][2] m[0][3] |   | 旋转/缩放     | 透视 |
    // | m[1][0] m[1][1] m[1][2] m[1][3] | = | 旋转/缩放     | 透视 |
    // | m[2][0] m[2][1] m[2][2] m[2][3] |   | 旋转/缩放     | 透视 |
    // | m[3][0] m[3][1] m[3][2] m[3][3] |   | 位移 (X,Y,Z) | 1    |
    float _m00, _m01, _m02, _m03;
    float _m04, _m05, _m06, _m07;
    float _m08, _m09, _m10, _m11;
    float _m12, _m13, _m14, _m15;
    float m00() { return this->_m00; }
    float m01() { return this->_m01; }
    float m02() { return this->_m02; }
    float m03() { return this->_m03; }
    float m04() { return this->_m04; }
    float m05() { return this->_m05; }
    float m06() { return this->_m06; }
    float m07() { return this->_m07; }
    float m08() { return this->_m08; }
    float m09() { return this->_m09; }
    float m10() { return this->_m10; }
    float m11() { return this->_m11; }
    float m12() { return this->_m12; }
    float m13() { return this->_m13; }
    float m14() { return this->_m14; }
    float m15() { return this->_m15; }

    Mat4();
    /**
     * @brief 平移
     * @param x
     * @param y
     * @param z
     */
    void translate(float x, float y, float z);
    Mat4 operator*(const Mat4 &other) const;

    ~Mat4();
};
